package com.sann;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * Bean后置处理器, 每个Bean对象在生成后（实例化后）,初始化前都要经过该处理器处理。
 *
 * Spring 通过提供BeanPostProcessor 来控制
 * Bean实例化后初始化前调用postProcessBeforeInitialization()
 * Bean初始化后调用postProcessAfterInitialization()。
 *
 * 1、Bean实例化：
 * Bean创建，根据字节码创建对象，再通过调用构造函数覆盖成员变量默认值。
 *
 * 2、Bean后置处理器执行
 *
 * 3、Bean初始化：
 * 标注有@Bean(initMethod = "init")
 * 实现接口方法InitializingBean#afterPropertiesSet()
 * 标注有@PostConstruct
 * 等方法属于Bean初始化方法。
 */
@Slf4j
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    /**
     * @param bean 如果Bean不需要我们做额外的封装，就直接将容器通过入参传递给我们的Bean直接返回
     * @param beanName 容器中该 Bean的名字
     * @return
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.info("---------->MyBeanPostProcessor#《--------{}初始化方法前被调用",beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        log.info("---------->MyBeanPostProcessor#》》》》》》》》{}初始化方法后被调用",beanName);
        return bean;
    }

}
